#include "TerrainHeightMapper.h"
#include "ui_TerrainHeightMapper.h"

TerrainHeightMapper::TerrainHeightMapper(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TerrainHeightMapper)
{
    ui->setupUi(this);
}

TerrainHeightMapper::~TerrainHeightMapper()
{
    delete ui;
}

// Esto carga y añade una textura a la lista
void TerrainHeightMapper::on_AddTButton_clicked()
{
    QString FileURL= QFileDialog::getOpenFileName(this,
                                                  "Escoger textura...",
                                                  "../", "*.png; *.jpg");

    if (FileURL!="")
    {
        MetaTexture* T= new MetaTexture();

        qDebug("getOpenFileName says: %s", FileURL.toStdString().c_str());

        // Vamos a extraer los datos de la textura
        T->pixmap= QPixmap(FileURL);
        T->size= QFile(FileURL).size() / 1024.0;
        T->width= T->pixmap.width();
        T->height= T->pixmap.height();

        QStringList Tokens= FileURL.split("/");
        T->name= Tokens.at(Tokens.size()-1);

        T->url= FileURL;

        Tokens.clear();
        Tokens= T->name.split(".");
        T->extension= Tokens.at(Tokens.size()-1);

        T->MaxH= T->OptimalH= T->MinH= 0;

        // Insertamos la textura en la lista visual y logica
        Textures.append(T);
        ui->TexturesList->addItem(T->name);

        LoadTextureInfo(T);
    }
}

// Esto sirve para navegar entre las texturas disponibles y obtener la solicitada
MetaTexture* TerrainHeightMapper::getTextureByName(QString input)
{
    for (int i=0; i<Textures.size(); i++)
        if (Textures.at(i)->name== input)
            return Textures.at(i);
}

// Esto carga toda la info de una textura en la interfaz
void TerrainHeightMapper::LoadTextureInfo(MetaTexture* T)
{
    ui->TNameInput->setText(T->name);

    if (T->url.length() < 35)
        ui->TURLInput->setText(T->url);
    else
        ui->TURLInput->setText(T->url.left(35)+QString("..."));
    ui->TExtensionInput->setText(T->extension);
    ui->TSizeInput->setText(QString("%1").arg(T->size)+QString(" KB"));
    ui->TDimensionsInput->setText(QString("%1x%2 pixeles").arg(T->width).arg(T->height));
    ui->TMaxHInput->setValue(T->MaxH);
    ui->TOptimalHInput->setValue(T->OptimalH);
    ui->TMinHInput->setValue(T->MinH);

    ui->TexturePreview->setPixmap(T->pixmap);
}

// Esto activara subprocesos al cambiar la altura maxima de la textura
void TerrainHeightMapper::on_TMaxHInput_valueChanged(int arg1)
{
    int opt;
    MetaTexture* t= getTextureByName(ui->TNameInput->text());
    t->MaxH= arg1;

    opt= ui->TOptimalHInput->value();

    if (arg1 < opt)
    {
        ui->TOptimalHInput->setValue(arg1);
        t->OptimalH= arg1;
    }
}

// Esto activara subprocesos al cambiar la altura optima de la textura
void TerrainHeightMapper::on_TOptimalHInput_valueChanged(int arg1)
{
    int min, max;

    min= ui->TMinHInput->value();
    max= ui->TMaxHInput->value();

    if (arg1 > max)
        ui->TMaxHInput->setValue(arg1);

    if (arg1 < min)
        ui->TMinHInput->setValue(arg1);
}

// Esto activara subprocesos al cambiar la altura minima de la textura
void TerrainHeightMapper::on_TMinHInput_valueChanged(int arg1)
{
    int opt;

    opt= ui->TOptimalHInput->value();

    if (arg1 > opt)
        ui->TOptimalHInput->setValue(arg1);
}

// Esto ocurrira cada vez que se seleccione una nueva textura
void TerrainHeightMapper::on_TexturesList_currentRowChanged(int currentRow)
{
    LoadTextureInfo(getTextureByName(ui->TexturesList->item(currentRow)->text().toStdString().c_str()));
}
